<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Java-JVM（面试） | Hexo</title>
  <meta name="keywords" content=" Java-JVM ">
  <meta name="description" content="Java-JVM（面试） | Hexo">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="description" content="如何解决消息过期失效问题RabbtiMQ 是可以设置过期时间的，也就是 TTL。如果消息在 queue 中积压超过一定的时间就会被 RabbitMQ 给清理掉，这个数据就没了。这就是说数据不会大量积压在 mq 里，而是大量的数据会直接搞丢。解决方法就是采用批量重导。 批量重导，也就是后期的一种手动补偿手段。当高峰期过去之后将丢失的那部分数据，写个临时程序查出来，重新放到MQ里，把白天的数据补回来。">
<meta property="og:type" content="article">
<meta property="og:title" content="Rabbit MQ（面试）">
<meta property="og:url" content="https://xiaomaer-sss.gitee.io/xiaomaer-sss/2023/02/03/Rabbit%20MQ%EF%BC%88%E9%9D%A2%E8%AF%95%EF%BC%89/index.html">
<meta property="og:site_name" content="Hexo">
<meta property="og:description" content="如何解决消息过期失效问题RabbtiMQ 是可以设置过期时间的，也就是 TTL。如果消息在 queue 中积压超过一定的时间就会被 RabbitMQ 给清理掉，这个数据就没了。这就是说数据不会大量积压在 mq 里，而是大量的数据会直接搞丢。解决方法就是采用批量重导。 批量重导，也就是后期的一种手动补偿手段。当高峰期过去之后将丢失的那部分数据，写个临时程序查出来，重新放到MQ里，把白天的数据补回来。">
<meta property="og:locale" content="en_US">
<meta property="article:published_time" content="2023-02-03T13:04:21.063Z">
<meta property="article:modified_time" content="2023-02-04T03:42:41.460Z">
<meta property="article:author" content="kiwi">
<meta property="article:tag" content="队列">
<meta property="article:tag" content="异步">
<meta name="twitter:card" content="summary">


<link rel="icon" href="/img/avatar.jpg">

<link href="/css/style.css?v=1.1.0" rel="stylesheet">

<link href="/css/hl_theme/atom-light.css?v=1.1.0" rel="stylesheet">

<link href="//cdn.jsdelivr.net/npm/animate.css@4.1.0/animate.min.css" rel="stylesheet">

<script src="//cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script>
<script src="/js/titleTip.js?v=1.1.0" ></script>

<script src="//cdn.jsdelivr.net/npm/highlightjs@9.16.2/highlight.pack.min.js"></script>
<script>
    hljs.initHighlightingOnLoad();
</script>

<script src="//cdn.jsdelivr.net/npm/nprogress@0.2.0/nprogress.min.js"></script>



<script src="//cdn.jsdelivr.net/npm/jquery.cookie@1.4.1/jquery.cookie.min.js" ></script>

<script src="/js/iconfont.js?v=1.1.0" ></script>

<meta name="generator" content="Hexo 5.4.2"></head>
<div style="display: none">
  <input class="theme_disqus_on" value="false">
  <input class="theme_preload_comment" value="">
  <input class="theme_blog_path" value="">
  <input id="theme_shortcut" value="true" />
  <input id="theme_highlight_on" value="true" />
  <input id="theme_code_copy" value="true" />
</div>



<body>
<aside class="nav">
    <div class="nav-left">
        <a href="/"
   class="avatar_target">
    <img class="avatar"
         src="/img/avatar.jpg"/>
</a>
<div class="author">
    <span>kiwi</span>
</div>

<div class="icon">
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
            <a title="csdn"
               href="https://blog.csdn.net/weixin_45340300?type=blog"
               target="_blank">
                
                    <svg class="iconfont-svg" aria-hidden="true">
                        <use xlink:href="#icon-csdn"></use>
                    </svg>
                
            </a>
        
    
        
    
        
    
        
            <a title="email"
               href="mailto:jackma.h@foxmail.com"
               target="_blank">
                
                    <svg class="iconfont-svg" aria-hidden="true">
                        <use xlink:href="#icon-email"></use>
                    </svg>
                
            </a>
        
    
        
            <a title="qq"
               href="http://wpa.qq.com/msgrd?v=3&uin=761791958&site=qq&menu=yes"
               target="_blank">
                
                    <svg class="iconfont-svg" aria-hidden="true">
                        <use xlink:href="#icon-qq"></use>
                    </svg>
                
            </a>
        
    
        
    
        
    
</div>




<ul>
    <li>
        <div class="all active" data-rel="All">All
            
                <small>(34)</small>
            
        </div>
    </li>
    
        
            
                <li>
                    <div data-rel="开发">
                        <i class="fold iconfont icon-right"></i>
                        
                        开发
                        <small>(34)</small>
                        
                    </div>
                    
                        <ul class="sub hide">
                            
                                <li>
                                    <div data-rel="开发<--->框架">
                                        
                                        框架
                                        
                                            <small>(14
                                                )</small>
                                        
                                    </div>
                                    
                                </li>
                            
                                <li>
                                    <div data-rel="开发<--->其他">
                                        
                                        其他
                                        
                                            <small>(5
                                                )</small>
                                        
                                    </div>
                                    
                                </li>
                            
                                <li>
                                    <div data-rel="开发<--->数据库">
                                        
                                        数据库
                                        
                                            <small>(2
                                                )</small>
                                        
                                    </div>
                                    
                                </li>
                            
                                <li>
                                    <div data-rel="开发<--->疑难杂症">
                                        
                                        疑难杂症
                                        
                                            <small>(2
                                                )</small>
                                        
                                    </div>
                                    
                                </li>
                            
                                <li>
                                    <div data-rel="开发<--->中间件">
                                        
                                        中间件
                                        
                                            <small>(5
                                                )</small>
                                        
                                    </div>
                                    
                                </li>
                            
                                <li>
                                    <div data-rel="开发<--->Java">
                                        
                                        Java
                                        
                                            <small>(6
                                                )</small>
                                        
                                    </div>
                                    
                                </li>
                            
                        </ul>
                    
                </li>
            
        
    
        
            
        
    
        
            
        
    
        
            
        
    
        
            
        
    
        
            
        
    
        
            
        
    
</ul>
<div class="left-bottom">
    <div class="menus">
        
            
            
            
    </div>
    <div>
        
        
    </div>
</div>
<input type="hidden" id="yelog_site_posts_number" value="34">
<input type="hidden" id="yelog_site_word_count" value="83.6k">
<div style="display: none">
    <span id="busuanzi_value_site_uv"></span>
    <span id="busuanzi_value_site_pv"></span>
</div>

    </div>
    <div class="nav-right">
        <div class="friends-area">
    <div class="friends-title">
        Links
        <i class="iconfont icon-left"></i>
    </div>
    <div class="friends-content">
        <ul>
            
            <li><a target="_blank" href="https://xiaomaer-sss.gitee.io/">叶落阁</a></li>
            
        </ul>
    </div>
</div>
        <div class="title-list">
    <div class="right-top">
        <div id="default-panel">
            <i class="iconfont icon-search" data-title="搜索 快捷键 i"></i>
            <div class="right-title">All</div>
            <i class="iconfont icon-file-tree" data-title="切换到大纲视图 快捷键 w"></i>
        </div>
        <div id="search-panel">
            <i class="iconfont icon-left" data-title="返回"></i>
            <input id="local-search-input" autocomplete="off"/>
            <label class="border-line" for="input"></label>
            <i class="iconfont icon-case-sensitive" data-title="大小写敏感"></i>
            <i class="iconfont icon-tag" data-title="标签"></i>
        </div>
        <div id="outline-panel" style="display: none">
            <div class="right-title">大纲</div>
            <i class="iconfont icon-list" data-title="切换到文章列表"></i>
        </div>
    </div>

    <div class="tags-list">
    <input id="tag-search" />
    <div class="tag-wrapper">
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>队列</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>分布式</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>缓存</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>流式处理</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>区块链</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>实战面试题</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>数据库</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>异步</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>Bug</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>Docker</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>Java</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>Java-集合</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>Java-进阶</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>Java-JVM</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>Java基础</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>LB</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>MQ</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>Mybatis</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>MySQL</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>Redis</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>Spring</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>Spring Cloud Alibaba</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>SpringBoot</a>
            </li>
        
    </div>

</div>

    
    <nav id="title-list-nav">
        
        
        <a  class="All 开发 中间件 "
           href="/xiaomaer-sss/2023/02/03/Rabbit%20MQ%EF%BC%88%E9%9D%A2%E8%AF%95%EF%BC%89/"
           data-tag="队列,异步"
           data-author="" >
            <span class="post-title" title="Rabbit MQ（面试）">Rabbit MQ（面试）</span>
            <span class="post-date" title="2023-02-03 21:04:21">2023/02/03</span>
        </a>
        
        
        <a  class="All 开发 Java "
           href="/xiaomaer-sss/2023/02/03/%E5%AE%9E%E6%88%98%E9%9D%A2%E8%AF%95%E9%A2%98%EF%BC%88%E9%9D%A2%E8%AF%95%EF%BC%89/"
           data-tag="实战面试题"
           data-author="" >
            <span class="post-title" title="实战面试题">实战面试题</span>
            <span class="post-date" title="2023-02-03 17:11:07">2023/02/03</span>
        </a>
        
        
        <a  class="All 开发 中间件 "
           href="/xiaomaer-sss/2023/02/02/Kafka%EF%BC%88%E9%9D%A2%E8%AF%95%EF%BC%89/"
           data-tag="分布式,流式处理,MQ"
           data-author="" >
            <span class="post-title" title="Kafka（面试）">Kafka（面试）</span>
            <span class="post-date" title="2023-02-02 09:51:06">2023/02/02</span>
        </a>
        
        
        <a  class="All 开发 中间件 "
           href="/xiaomaer-sss/2023/02/02/Zookeeper%EF%BC%88%E9%9D%A2%E8%AF%95%EF%BC%89/"
           data-tag="分布式"
           data-author="" >
            <span class="post-title" title="Zookeeper（面试）">Zookeeper（面试）</span>
            <span class="post-date" title="2023-02-02 09:50:33">2023/02/02</span>
        </a>
        
        
        <a  class="All 开发 中间件 "
           href="/xiaomaer-sss/2023/02/01/Redis%EF%BC%88%E9%9D%A2%E8%AF%95%EF%BC%89/"
           data-tag="Redis,缓存"
           data-author="" >
            <span class="post-title" title="Redis（面试）">Redis（面试）</span>
            <span class="post-date" title="2023-02-01 14:09:09">2023/02/01</span>
        </a>
        
        
        <a  class="All 开发 框架 "
           href="/xiaomaer-sss/2023/01/30/SpringBoot%EF%BC%88%E9%9D%A2%E8%AF%95%EF%BC%89/"
           data-tag="SpringBoot"
           data-author="" >
            <span class="post-title" title="SpringBoot（面试）">SpringBoot（面试）</span>
            <span class="post-date" title="2023-01-30 20:26:42">2023/01/30</span>
        </a>
        
        
        <a  class="All 开发 框架 "
           href="/xiaomaer-sss/2023/01/30/Mybatis%EF%BC%88%E9%9D%A2%E8%AF%95%EF%BC%89/"
           data-tag="Mybatis"
           data-author="" >
            <span class="post-title" title="Mybatis（面试）">Mybatis（面试）</span>
            <span class="post-date" title="2023-01-30 19:13:44">2023/01/30</span>
        </a>
        
        
        <a  class="All 开发 框架 "
           href="/xiaomaer-sss/2023/01/30/Spring%EF%BC%88%E9%9D%A2%E8%AF%95%EF%BC%89/"
           data-tag="Spring"
           data-author="" >
            <span class="post-title" title="Spring（面试）">Spring（面试）</span>
            <span class="post-date" title="2023-01-30 19:12:30">2023/01/30</span>
        </a>
        
        
        <a  class="All 开发 Java "
           href="/xiaomaer-sss/2023/01/29/Java-JVM%EF%BC%88%E9%9D%A2%E8%AF%95%EF%BC%89/"
           data-tag="Java-JVM"
           data-author="" >
            <span class="post-title" title="Java-JVM（面试）">Java-JVM（面试）</span>
            <span class="post-date" title="2023-01-29 16:31:34">2023/01/29</span>
        </a>
        
        
        <a  class="All 开发 Java "
           href="/xiaomaer-sss/2023/01/29/Java-%E8%BF%9B%E9%98%B6%EF%BC%88%E9%9D%A2%E8%AF%95%EF%BC%89/"
           data-tag="Java-进阶"
           data-author="" >
            <span class="post-title" title="Java-进阶（面试）">Java-进阶（面试）</span>
            <span class="post-date" title="2023-01-29 13:11:10">2023/01/29</span>
        </a>
        
        
        <a  class="All 开发 Java "
           href="/xiaomaer-sss/2023/01/29/Java-%E9%9B%86%E5%90%88%EF%BC%88%E9%9D%A2%E8%AF%95%EF%BC%89/"
           data-tag="Java-集合"
           data-author="" >
            <span class="post-title" title="Java-集合（面试）">Java-集合（面试）</span>
            <span class="post-date" title="2023-01-29 09:18:51">2023/01/29</span>
        </a>
        
        
        <a  class="All 开发 数据库 "
           href="/xiaomaer-sss/2023/01/28/%E6%95%B0%E6%8D%AE%E5%BA%93-MySQL%EF%BC%88%E9%9D%A2%E8%AF%95%EF%BC%89/"
           data-tag="MySQL"
           data-author="" >
            <span class="post-title" title="数据库-MySQL（面试）">数据库-MySQL（面试）</span>
            <span class="post-date" title="2023-01-28 16:50:59">2023/01/28</span>
        </a>
        
        
        <a  class="All 开发 Java "
           href="/xiaomaer-sss/2023/01/27/Java-%E5%9F%BA%E7%A1%80%EF%BC%88%E9%9D%A2%E8%AF%95%EF%BC%89/"
           data-tag="Java基础"
           data-author="" >
            <span class="post-title" title="Java-基础（面试）">Java-基础（面试）</span>
            <span class="post-date" title="2023-01-27 19:42:58">2023/01/27</span>
        </a>
        
        
        <a  class="All 开发 其他 "
           href="/xiaomaer-sss/2023/01/27/%E5%8C%BA%E5%9D%97%E9%93%BE%E9%92%B1%E5%8C%85/"
           data-tag="区块链"
           data-author="" >
            <span class="post-title" title="区块链钱包">区块链钱包</span>
            <span class="post-date" title="2023-01-27 18:57:51">2023/01/27</span>
        </a>
        
        
        <a  class="All 开发 其他 "
           href="/xiaomaer-sss/2023/01/27/Truffle%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/"
           data-tag="区块链"
           data-author="" >
            <span class="post-title" title="Truffle常用命令&amp;Web3常用方法">Truffle常用命令&amp;Web3常用方法</span>
            <span class="post-date" title="2023-01-27 18:57:51">2023/01/27</span>
        </a>
        
        
        <a  class="All 开发 其他 "
           href="/xiaomaer-sss/2023/01/27/Truffle&OpenZeppelin%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/"
           data-tag="区块链"
           data-author="" >
            <span class="post-title" title="Truffle&amp;OpenZeppelin环境搭建">Truffle&amp;OpenZeppelin环境搭建</span>
            <span class="post-date" title="2023-01-27 18:57:51">2023/01/27</span>
        </a>
        
        
        <a  class="All 开发 其他 "
           href="/xiaomaer-sss/2023/01/27/Solidity/"
           data-tag="区块链"
           data-author="" >
            <span class="post-title" title="Solidity">Solidity</span>
            <span class="post-date" title="2023-01-27 18:57:51">2023/01/27</span>
        </a>
        
        
        <a  class="All 开发 中间件 "
           href="/xiaomaer-sss/2023/01/27/Nginx/"
           data-tag="LB"
           data-author="" >
            <span class="post-title" title="Nginx">Nginx</span>
            <span class="post-date" title="2023-01-27 18:57:51">2023/01/27</span>
        </a>
        
        
        <a  class="All 开发 框架 "
           href="/xiaomaer-sss/2023/01/27/DockerFile/"
           data-tag="Docker"
           data-author="" >
            <span class="post-title" title="Dockerfile">Dockerfile</span>
            <span class="post-date" title="2023-01-27 17:45:23">2023/01/27</span>
        </a>
        
        
        <a  class="All 开发 其他 "
           href="/xiaomaer-sss/2023/01/27/%E5%8C%BA%E5%9D%97%E9%93%BE%E4%B9%8B%E4%BB%A5%E5%A4%AA%E5%9D%8A/"
           data-tag="区块链"
           data-author="" >
            <span class="post-title" title="区块链之以太坊">区块链之以太坊</span>
            <span class="post-date" title="2023-01-27 17:45:23">2023/01/27</span>
        </a>
        
        
        <a  class="All 开发 数据库 "
           href="/xiaomaer-sss/2023/01/27/%E5%B8%B8%E7%94%A8SQL%E8%AF%AD%E6%B3%95%E6%95%B4%E7%90%86/"
           data-tag="MySQL,数据库"
           data-author="" >
            <span class="post-title" title="常用SQL语法整理">常用SQL语法整理</span>
            <span class="post-date" title="2023-01-27 17:45:23">2023/01/27</span>
        </a>
        
        
        <a  class="All 开发 框架 "
           href="/xiaomaer-sss/2023/01/27/docker%E8%BF%9B%E9%98%B6/"
           data-tag="Docker"
           data-author="" >
            <span class="post-title" title="Docker进阶">Docker进阶</span>
            <span class="post-date" title="2023-01-27 17:45:23">2023/01/27</span>
        </a>
        
        
        <a  class="All 开发 框架 "
           href="/xiaomaer-sss/2023/01/27/Docker%E5%9F%BA%E7%A1%80/"
           data-tag="Docker"
           data-author="" >
            <span class="post-title" title="Docker基础">Docker基础</span>
            <span class="post-date" title="2023-01-27 17:45:23">2023/01/27</span>
        </a>
        
        
        <a  class="All 开发 框架 "
           href="/xiaomaer-sss/2023/01/27/Docker%E5%AE%89%E8%A3%85%E5%B8%B8%E8%A7%81%E7%BB%84%E4%BB%B6/"
           data-tag="Docker"
           data-author="" >
            <span class="post-title" title="Docker安装常见组件">Docker安装常见组件</span>
            <span class="post-date" title="2023-01-27 17:45:23">2023/01/27</span>
        </a>
        
        
        <a  class="All 开发 框架 "
           href="/xiaomaer-sss/2023/01/26/SkyWalking/"
           data-tag="Spring Cloud Alibaba"
           data-author="" >
            <span class="post-title" title="SkyWalking">SkyWalking</span>
            <span class="post-date" title="2023-01-26 21:39:44">2023/01/26</span>
        </a>
        
        
        <a  class="All 开发 框架 "
           href="/xiaomaer-sss/2023/01/26/Sentinel/"
           data-tag="Spring Cloud Alibaba"
           data-author="" >
            <span class="post-title" title="Sentinel">Sentinel</span>
            <span class="post-date" title="2023-01-26 21:39:44">2023/01/26</span>
        </a>
        
        
        <a  class="All 开发 框架 "
           href="/xiaomaer-sss/2023/01/26/Seata/"
           data-tag="Spring Cloud Alibaba"
           data-author="" >
            <span class="post-title" title="Seata">Seata</span>
            <span class="post-date" title="2023-01-26 21:39:44">2023/01/26</span>
        </a>
        
        
        <a  class="All 开发 框架 "
           href="/xiaomaer-sss/2023/01/26/Ribbon/"
           data-tag="Spring Cloud Alibaba"
           data-author="" >
            <span class="post-title" title="Ribbon">Ribbon</span>
            <span class="post-date" title="2023-01-26 21:39:44">2023/01/26</span>
        </a>
        
        
        <a  class="All 开发 疑难杂症 "
           href="/xiaomaer-sss/2023/01/26/github%E6%8B%89%E5%8F%96%E4%BB%A3%E7%A0%81%E6%8A%A5%20git@github.com's%20password/"
           data-tag="Bug"
           data-author="" >
            <span class="post-title" title="github拉取代码报 &#34;git@github.com&#39;s password&#34;">github拉取代码报 &#34;git@github.com&#39;s password&#34;</span>
            <span class="post-date" title="2023-01-26 21:39:44">2023/01/26</span>
        </a>
        
        
        <a  class="All 开发 疑难杂症 "
           href="/xiaomaer-sss/2023/01/26/gitee%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E6%95%99%E7%A8%8B/"
           data-tag="Bug"
           data-author="" >
            <span class="post-title" title="gitee搭建个人博客教程">gitee搭建个人博客教程</span>
            <span class="post-date" title="2023-01-26 21:39:44">2023/01/26</span>
        </a>
        
        
        <a  class="All 开发 框架 "
           href="/xiaomaer-sss/2023/01/26/GateWay/"
           data-tag="Spring Cloud Alibaba"
           data-author="" >
            <span class="post-title" title="GateWay">GateWay</span>
            <span class="post-date" title="2023-01-26 21:39:44">2023/01/26</span>
        </a>
        
        
        <a  class="All 开发 框架 "
           href="/xiaomaer-sss/2023/01/26/Fegin/"
           data-tag="Spring Cloud Alibaba"
           data-author="" >
            <span class="post-title" title="Fegin">Fegin</span>
            <span class="post-date" title="2023-01-26 21:39:44">2023/01/26</span>
        </a>
        
        
        <a  class="All 开发 框架 "
           href="/xiaomaer-sss/2023/01/20/Nacos/"
           data-tag="Spring Cloud Alibaba"
           data-author="" >
            <span class="post-title" title="Nacos">Nacos</span>
            <span class="post-date" title="2023-01-20 17:12:00">2023/01/20</span>
        </a>
        
        
        <a  class="All 开发 Java "
           href="/xiaomaer-sss/2023/01/17/hello-world/"
           data-tag="Java"
           data-author="" >
            <span class="post-title" title="Hello World">Hello World</span>
            <span class="post-date" title="2023-01-17 15:40:39">2023/01/17</span>
        </a>
        
        <div id="no-item-tips">

        </div>
    </nav>
    <div id="outline-list">
    </div>
</div>

    </div>
    <div class="hide-list">
        <div class="semicircle" data-title="切换全屏 快捷键 s">
            <div class="brackets first"><</div>
            <div class="brackets">&gt;</div>
        </div>
    </div>
</aside>
<div id="post">
    <div class="pjax">
        <article id="post-Java-JVM（面试）" class="article article-type-post" itemscope itemprop="blogPost">
    
        <h1 class="article-title">Java-JVM（面试）</h1>
    
    <div class="article-meta">
        
        
        
        <span class="book">
            <i class="iconfont icon-category"></i>
            
            
            <a  data-rel="开发">开发</a> > 
            
            <a  data-rel="开发&lt;---&gt;Java">Java</a>
            
        </span>
        
        
        <span class="tag">
            <i class="iconfont icon-tag"></i>
            
            <a class="color4">Java-JVM</a>
            
        </span>
        
    </div>
    <div class="article-meta">
        
            Created At : <time class="date" title='Updated At: 2023-02-04 16:27:02'>2023-01-29 16:31</time>
        
    </div>
    <div class="article-meta">
        
        <span>Count:5.7k</span>
        
        
        <span id="busuanzi_container_page_pv">
            Views 👀 :<span id="busuanzi_value_page_pv">
                <span class="count-comment">
                    <span class="spinner">
                      <div class="cube1"></div>
                      <div class="cube2"></div>
                    </span>
                </span>
            </span>
        </span>
        
        
    </div>
    
    <div class="toc-ref">
    
        <ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#JVM%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84%E7%BB%84%E6%88%90"><span class="toc-text">JVM体系结构组成</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#JVM%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B"><span class="toc-text">JVM内存模型</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%8F%8C%E4%BA%B2%E5%A7%94%E6%B4%BE%E6%A8%A1%E5%BC%8F"><span class="toc-text">双亲委派模式</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6"><span class="toc-text">垃圾回收机制</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E7%9A%84%E7%AE%97%E6%B3%95"><span class="toc-text">垃圾回收的算法</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%A0%87%E8%AE%B0-%E6%B8%85%E9%99%A4%E7%AE%97%E6%B3%95"><span class="toc-text">标记-清除算法</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%A0%87%E8%AE%B0-%E6%95%B4%E7%90%86%E7%AE%97%E6%B3%95"><span class="toc-text">标记-整理算法</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%A4%8D%E5%88%B6%E7%AE%97%E6%B3%95"><span class="toc-text">复制算法</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#ZGC%E7%AE%97%E6%B3%95"><span class="toc-text">ZGC算法</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#YanG-GC"><span class="toc-text">YanG GC</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#old-GC"><span class="toc-text">old GC</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E5%99%A8"><span class="toc-text">垃圾回收器</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#G1%E6%94%B6%E9%9B%86%E5%99%A8"><span class="toc-text">G1收集器</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#CMS"><span class="toc-text">CMS</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%BB%80%E4%B9%88%E6%97%B6%E5%80%99%E8%A7%A6%E5%8F%91FullGCC"><span class="toc-text">什么时候触发FullGCC</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#GC%E9%A2%91%E7%8E%87"><span class="toc-text">GC频率</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%A6%82%E4%BD%95%E7%A1%AE%E5%AE%9A%E5%AF%B9%E8%B1%A1%E5%8F%AF%E4%BB%A5%E8%A2%AB%E5%9B%9E%E6%94%B6"><span class="toc-text">如何确定对象可以被回收</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%93%AA%E4%BA%9B%E5%AF%B9%E8%B1%A1%E5%8F%AF%E4%BB%A5%E8%A2%AB%E6%A0%87%E8%AE%B0%E4%B8%BAGC-Root"><span class="toc-text">哪些对象可以被标记为GC Root</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Minor-GC%E4%B8%8EFull-GC%E5%88%86%E5%88%AB%E5%9C%A8%E4%BB%80%E4%B9%88%E6%97%B6%E5%80%99%E5%8F%91%E7%94%9F"><span class="toc-text">Minor GC与Full GC分别在什么时候发生</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#GC%E4%BC%98%E5%8C%96%E6%A1%88%E4%BE%8B"><span class="toc-text">GC优化案例</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#JVM%E8%B0%83%E4%BC%98%E4%B9%8B%E5%89%8D%E7%9A%84%E5%8E%9F%E5%88%99"><span class="toc-text">JVM调优之前的原则</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#JVM%E8%B0%83%E4%BC%98%E5%91%BD%E4%BB%A4%E6%9C%89%E5%93%AA%E4%BA%9B"><span class="toc-text">JVM调优命令有哪些</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E8%B0%83%E4%BC%98%E5%B7%A5%E5%85%B7"><span class="toc-text">调优工具</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#JVM%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98%E5%8F%82%E6%95%B0%E6%9C%89%E5%93%AA%E4%BA%9B"><span class="toc-text">JVM性能调优参数有哪些</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#JVM%E6%A0%B8%E5%BF%83%E5%8F%82%E6%95%B0%E6%9C%89%E5%93%AA%E4%BA%9B"><span class="toc-text">JVM核心参数有哪些</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%85%83%E7%A9%BA%E9%97%B4%E9%87%8C%E9%9D%A2%E5%AD%98%E6%94%BE%E7%9A%84%E6%98%AF%E4%BB%80%E4%B9%88"><span class="toc-text">元空间里面存放的是什么</span></a></li></ol>
    
<style>
    .left-col .switch-btn,
    .left-col .switch-area {
        display: none;
    }
    .toc-level-3 i,
    .toc-level-3 ol {
        display: none !important;
    }
</style>
</div>
    
    <div class="article-entry" itemprop="articleBody">
      
        <p>JVM相关内容：</p>
<p><img src="https://gitee.com/xiaomaer-sss/picgo/raw/master/images/2023/image-20230129164407061.png" alt="image-20230129164407061"></p>
<p><strong>内存模型，类加载机制，GC是重点方面。</strong>性能调优部分更偏向应用，重点突出实践能力。编译器优化和执行模式部分偏向于理论基础。</p>
<h2 id="JVM体系结构组成"><a href="#JVM体系结构组成" class="headerlink" title="JVM体系结构组成"></a>JVM体系结构组成</h2><p><img src="https://gitee.com/xiaomaer-sss/picgo/raw/master/images/2023/image-20230129214049585.png" alt="image-20230129214049585"></p>
<h2 id="JVM内存模型"><a href="#JVM内存模型" class="headerlink" title="JVM内存模型"></a>JVM内存模型</h2><p><img src="https://gitee.com/xiaomaer-sss/picgo/raw/master/images/2023/image-20230129173649533.png" alt="image-20230129173649533"></p>
<p>线程私有：栈，本地方法栈，程序计数器</p>
<p>线程共享：堆，方法区</p>
<ul>
<li><p>栈<br>又称方法栈，线程私有的，线程执行方法是都会创建一个栈阵，用来存储局部变量表，操作栈，动态链接，方法出口等信息。调用方法时执行入栈，方法返回时执行出栈。</p>
</li>
<li><p>本地方法栈<br>与栈类似，也是用来保存执行方法的信息。执行Java方法是使用栈，执行Native方法时使用本地方法栈</p>
</li>
<li><p>程序计数器<br>保存着当前线程执行的字节码位置，每个线程工作时都有独立的计数器，只为执行Java方法服务，执行Native方法时，程序计数器为空。</p>
</li>
<li><p>堆<br>JVM内存管理最大的一块，被线程共享，目的是存放对象的实例，几乎所有的对象实例都会放在这里，当堆没有可用空间时，会抛出OOM异常。根据对象的存活周期不同，JVM把对象进行分代管理，由垃圾回收器进行 垃圾的回收管理。刚创建的对象在新生代的Eden区中，经过GC后进入新生代的s0区中，再经过GC进入新生代的s1区中，15次（默认值为15，通过-XX:MaxTenuringThreshold设置）GC后仍存在就进入老年代。<br><img src="https://gitee.com/xiaomaer-sss/picgo/raw/master/images/2023/image-20230129223824442.png" alt="image-20230129223824442"></p>
</li>
<li><p>方法区<br>又称非堆区，用于存储已被虚拟机加载的类信息，常量、静态变量，即编译器优化后的代码等数据。1.7的永久代和1.8的元空间都是方法区的一种实现。（JDK1.8中已经移除了永久代，新加了一个叫做元数据区的native）</p>
</li>
</ul>
<h2 id="双亲委派模式"><a href="#双亲委派模式" class="headerlink" title="双亲委派模式"></a>双亲委派模式</h2><p>双亲委派模式：即加载器加载类时先把请求委托给自己的父类加载器执行，直到顶层的启动类加载器。父类加载器能够完成加载则成功返回，不能则子类加载器才自己尝试加载。</p>
<p>下图依次对应：启动类加载器、扩展类加载器、应用类加载器、自定义类加载器</p>
<p><img src="https://gitee.com/xiaomaer-sss/picgo/raw/master/images/2023/image-20230129165800628.png" alt="image-20230129165800628"></p>
<p>优点：</p>
<ol>
<li>避免类的重复加载</li>
<li>避免Java的核心API被篡改</li>
</ol>
<h2 id="垃圾回收机制"><a href="#垃圾回收机制" class="headerlink" title="垃圾回收机制"></a>垃圾回收机制</h2><p>在java中，程序员是不需要显示的去释放一个对象的内存的，而是由虚拟机自行执行。在JVM中， 有一个垃圾回收线程，它是低优先级的，在正常情况下是不会执行的，只有在虚拟机空闲或者当前堆内存不足时，才会触发执行，扫面那些没有被任何引用的对象，并将它们添加到要回收的集合中，进行回收</p>
<h2 id="垃圾回收的算法"><a href="#垃圾回收的算法" class="headerlink" title="垃圾回收的算法"></a>垃圾回收的算法</h2><p>GC最基础的算法有三种： 标记 -清除算法、标记-整理算法、复制算法，我们常用的垃圾回收器一般都采用<strong>分代收集算法</strong>。</p>
<h3 id="标记-清除算法"><a href="#标记-清除算法" class="headerlink" title="标记-清除算法"></a>标记-清除算法</h3><p>从根集合（GC Root）开始扫描，对存活的对象进行标记，标记完毕后，再扫描整个空间中未标记的对象，并进行清除。缺点是会产生内存碎片（清除两个1K的内存，如果重新创建一个2K的对象是无法将新创建的对象放进刚清除的内存空间上的，因为这两个1k的内存可能不是连续的）</p>
<h3 id="标记-整理算法"><a href="#标记-整理算法" class="headerlink" title="标记-整理算法"></a>标记-整理算法</h3><p>和标记-清除一样，是对活的对象进行标记，但是在清除后的处理不一样，标记-整理在清除对象占用的内存后，会把所有活的对象向左端空闲空间移动，然后再更新引用其对象的指针。也就可以解决内存碎片的问题，但缺点就是需要对对象进行移动，因此成本会比较高</p>
<h3 id="复制算法"><a href="#复制算法" class="headerlink" title="复制算法"></a>复制算法</h3><p>从根集合（GC Root）扫描出存活的对象，并将找到的存活的对象复制到一块新的完全未被使用的空间。（当要回收的空间中存活对象较少时，复制算法会比较高效）缺点是要增加一块空的内存空间</p>
<h3 id="ZGC算法"><a href="#ZGC算法" class="headerlink" title="ZGC算法"></a>ZGC算法</h3><p>前面提供的高效垃圾回收算法，针对大堆内存设计，可以处理TB级别的堆，可以做到10ms以下的回收停顿时间。<br><img src="https://gitee.com/xiaomaer-sss/picgo/raw/master/images/2023/image-20230129173222178.png" alt="image-20230129173222178"></p>
<h3 id="YanG-GC"><a href="#YanG-GC" class="headerlink" title="YanG GC"></a>YanG GC</h3><p>Yang GC又称采Minor GC、YGC。用的是复制算法（Java对象的存活周期一般都比较短），S0和S1是交替使用的，每次使用没有被清除掉的对象会给age+1；当age=6的时候该对象就会放到old老年区中。</p>
<p>Young GC每次都会引起全线停顿(Stop-The-World)，暂停所有的应用线程，停顿时间相对老年代GC的造成的停顿，几乎可以忽略不计</p>
<h3 id="old-GC"><a href="#old-GC" class="headerlink" title="old GC"></a>old GC</h3><p>old GC采用的是标记-清理或者标记-整理算法。old中存放的是age &gt; 15的对象和大对象（大对象可通过-XX:PretenureSizeThreshold参数设置，默认为0）</p>
<h2 id="垃圾回收器"><a href="#垃圾回收器" class="headerlink" title="垃圾回收器"></a>垃圾回收器</h2><p>如果说垃圾收集算法是内存回收的方法论，那么垃圾收集器就是内存回收的具体实现。下图展示了7种作用于不同分代的收集器，其中用于回收新生代的收集器 包括Serial、PraNew、Parallel Scavenge。回收老年代的收集器包括Serial Old、Parallel Old、CMS。还有用于回收整个Java堆的G1收集器。不同收集器之间的连线表示它们可以搭配使用。</p>
<p><img src="https://gitee.com/xiaomaer-sss/picgo/raw/master/images/2023/image-20230204154843051.png" alt="image-20230204154843051"></p>
<ul>
<li>Serial收集器（复制算法)：新生代单线程收集器，标记和清理都是单线程，优点是简单高效</li>
<li>ParNew收集器 (复制算法)：新生代收并行集器，实际上是Serial收集器的多线程 版本，在多核CPU环境下有着比Serial更好的表现</li>
<li>Parallel Scavenge收集器 (复制算法)：新生代并行收集器，追求高吞吐量，高效利用CPU。吞吐量 = 用户线程时间/(用户线程时间+GC线程时间)，高吞吐量可以高效率的利用CPU时间，尽快完成程序的运算任务，适合后台应用等对，交互相应要求不高的场景 </li>
<li>Serial Old收集器 (标记-整理算法)：老年代单线程收集器，Serial收集器的老年代版本</li>
<li>Parallel Old收集器 (标记-整理算法)： 老年代并行收集器，吞吐量优先， Parallel Scavenge收集器的老年代版本</li>
<li>CMS(Concurrent Mark Sweep)收集器（标记-清除算法）： 老年代并行收集器，以获取最短回收停顿时间为目标的收集器，具有高并发、低停顿的特点，追求最短GC回收停顿时间</li>
<li>G1(Garbage First)收集器 (标记-整理算法)： Java堆并行收集器，G1收集器是 JDK1.7提供的一个新收集器，G1收集器基于“标记-整理”算法实现，也就是说不会产生内存碎片。此外，G1收集器不同于之前的收集器的一个重要特点是，G1回收的范围是整个Java堆（包括新生代，老年代），而前六种收集器回收的范围仅限于新生代或老年代。</li>
</ul>
<h3 id="G1收集器"><a href="#G1收集器" class="headerlink" title="G1收集器"></a>G1收集器</h3><p>JDK1.9之后默认的垃圾回收算法。特点是保持高回收率的同时减少停顿。采用每次只清理一部分，而不是清理全部的增量式清理，以保证停顿时间不会过长，其取消了年轻代与老年代的物理划分，但仍属于分代收集器。算法将堆分为若干个逻辑区域(region)，一部分用作年轻代，一部分用作老年代，还有用来存储巨型对象的分区。同CMS相同，会遍历所有对象，标记引用情况，清除对象后会对区域进行复制移动，以整合碎片空间。</p>
<p>G1收集器有个概念就是将内存划分为很多个小块，也就是Regian。G1的清理其实是不干净的，但我们不需要完全的清理干净，每次我们只清理大部分也能保证系统的正常的运行，这就是mix GC做的事情。就好比你妈让你打扫房间，你只用把眼皮子底下的垃圾捡一下就可以过关了，而不用清理床底桌子底下的垃圾灰尘。</p>
<p>G1中的区域有Eden space、Survivor space、Old Generation和存放超过一个Region的50%空间的Humongous区域。Humongous可以理解为是巨型对象，属于老年代。在G1中任何一个Region都可能是这三种区域。</p>
<h3 id="CMS"><a href="#CMS" class="headerlink" title="CMS"></a>CMS</h3><p>了解CMS之前，需要先了解几个名词。</p>
<ul>
<li>可达性分析算法<br>用于判断对象是否存活，基本思想是通过一系列称为GC Root的对象作为起点（常见的GC Root有系统类加载器、栈中的对象、处于激活状态的线程等），基于对象引用关系，从GC Roots开始向下搜索，所走过的路径称为引用链，当一个对象到GC Root没有任何引用链相连，证明对象不再存活</li>
<li>Stop The World<br>GC过程中分析对象引用关系，为了保证分析结果的准确性，需要通过停顿所有Java执行线程，保证引用关系不再动态变化，该停顿事件称为Stop The World(STW)</li>
<li>Safepoint<br>代码执行过程中的一些特殊位置，当线程执行到这些位置的时候，说明虚拟机当前的状态是安全的，如果有需要GC，线程可以在这个位置暂停。HotSpot采用主动中断的方式，让执行线程在运行期轮询是否需要暂停的标志，若需要则中断挂起</li>
</ul>
<p><strong>CMS简介</strong>：</p>
<p>CMS(Concurrent Mark and Sweep 并发-标记-清除)，是一款基于并发、使用标记清除算法的垃圾回收算法，只针对老年代进行垃圾回收。CMS收集器工作时，尽可能让GC线程和用户线程并发执行，以达到降低STW时间的目的。</p>
<p>启用CMS垃圾收集器命如下：</p>
<pre><code class="bash">-XX:+UseConcMarkSweepGC
</code></pre>
<p>值得补充的是，下面介绍到的CMS GC是指老年代的GC，而Full GC指的是整个堆的GC事件，包括新生代、老年代、元空间等，两者有所区分</p>
<h2 id="什么时候触发FullGCC"><a href="#什么时候触发FullGCC" class="headerlink" title="什么时候触发FullGCC"></a>什么时候触发FullGCC</h2><p>除直接调用System.gc外，触发Full GC执行的情况有如下四种。</p>
<ol>
<li><p><strong>旧生代空间不足</strong><br>旧生代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象，当执行Full GC后空间仍然不足，则抛出如下错误： java.lang.OutOfMemoryError: Java heap space 为避免以上两种状况引起的FullGC，调优时应尽量做到让对象在Minor GC阶段被回收、让对象在新生代多存活一段时间，以及不要创建过大的对象及数组</p>
</li>
<li><p><strong>Permanet Generation空间满</strong><br>Permanet Generation中存放的为一些class的信息等，当系统中要加载的类、反射的类和调用的方法较多时，Permanet Generation可能会被占满，在未配置为采用CMS GC的情况下会执行Full GC。如果经过Full GC仍然回收不了，那么JVM会抛出如下错误信息： java.lang.OutOfMemoryError: PermGen space 为避免Perm Gen占满造成Full GC现象，可采用的方法为增大Perm Gen空间或转为使用CMS GC。</p>
</li>
<li><p><strong>CMS GC时出现promotion failed和concurrent mode failure</strong><br>对于采用CMS进行旧生代GC的程序而言，尤其要注意GC日志中是否有promotion failed和concurrent mode failure两种状况，当这两种状况出现时可能会触发Full GC。<br>promotion failed是在进行Minor GC时，survivor space放不下、对象只能放入旧生代，而此时旧生代也放不下造成的。<br>concurrent mode failure是在执行CMS GC的过程中同时有对象要放入旧生代，而此时旧生代空间不足造成的。<br>应对措施为：增大survivor space、旧生代空间或调低触发并发GC的比率，但在JDK 5.0+、6.0+的版本中有可能会由于JDK的bug29导致CMS在remark完毕后很久才触发sweeping动作。对于这种状况，可通过设置参数  -XX:CMSMaxAbortablePrecleanTime=5（单位为ms）来避免。</p>
</li>
<li><p><strong>统计得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间</strong></p>
<p>这是一个较为复杂的触发情况，Hotspot为了避免由于新生代对象晋升到旧生代导致旧生代空间不足的 现象，在进行Minor GC时，做了一个判断，如果之前统计所得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间，那么就直接触发Full GC。 例如程序第一次触发Minor GC后，有6MB的对象晋升到旧生代，那么当下一次Minor GC发生时，首先 检查旧生代的剩余空间是否大于6MB，如果小于6MB，则执行Full GC。 当新生代采用PS GC时，方式稍有不同，PS GC是在Minor GC后也会检查，例如上面的例子中第一次 Minor GC后，PS GC会检查此时旧生代的剩余空间是否大于6MB，如小于，则触发对旧生代的回收。 </p>
<p>除了以上4种状况外，对于使用RMI来进行RPC或管理的Sun JDK应用而言，默认情况下会一小时执行一 次Full GC。可通过在启动时通过- java-Dsun.rmi.dgc.client.gcInterval=3600000来设置Full GC执行的间隔时间或通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc。</p>
</li>
</ol>
<h2 id="GC频率"><a href="#GC频率" class="headerlink" title="GC频率"></a>GC频率</h2><p>如果各项参数设置合理，系统没有超时日志出现，GC频率不高，GC耗时不高，那么没有必要进行GC优化。如果GC时间超过1-3秒，或者频繁GC，则必须优化。</p>
<p> 如果满足下面的指标，则一般不需要进行GC优化：</p>
<ul>
<li>Minor GC执行时间不到50ms。Minor GC执行不频繁，约10秒一次</li>
<li>Full GC执行时间不到1s。Full GC执行频率不算频繁，不低于10分钟1次</li>
</ul>
<h2 id="如何确定对象可以被回收"><a href="#如何确定对象可以被回收" class="headerlink" title="如何确定对象可以被回收"></a>如何确定对象可以被回收</h2><ul>
<li>引用计数<br>每个对象有一个引用计数属性，新增一个引用时计数加1，引用释放时计数减1，计数 为0时可以回收。此方法简单，无法解决对象相互循环引用的问题</li>
<li>可达性分析<br>从GC Roots开始向下搜索，搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时，则证明此对象是不可用的，不可达对象</li>
</ul>
<h2 id="哪些对象可以被标记为GC-Root"><a href="#哪些对象可以被标记为GC-Root" class="headerlink" title="哪些对象可以被标记为GC Root"></a>哪些对象可以被标记为GC Root</h2><p>常见的GC Root有系统类加载器、栈中的对象、处于激活状态的线程等</p>
<h2 id="Minor-GC与Full-GC分别在什么时候发生"><a href="#Minor-GC与Full-GC分别在什么时候发生" class="headerlink" title="Minor GC与Full GC分别在什么时候发生"></a>Minor GC与Full GC分别在什么时候发生</h2><p>新生代内存不够用时候发生Minor GC也叫YGC，JVM内存不够的时候发生Full GC。另外老年代内存不足触发的GC叫Major GC</p>
<h2 id="GC优化案例"><a href="#GC优化案例" class="headerlink" title="GC优化案例"></a>GC优化案例</h2><h2 id="JVM调优之前的原则"><a href="#JVM调优之前的原则" class="headerlink" title="JVM调优之前的原则"></a>JVM调优之前的原则</h2><ol>
<li>多数的Java应用不需要在服务器上进行GC优化</li>
<li>多数导致GC问题的Java应用，都不是因为我们参数设置错误，而是代码问题</li>
<li>在应用上线之前，先考虑将机器的JVM参数设置到最优（最适合）</li>
<li>减少创建对象的数量</li>
<li>减少使用全局变量和大对象</li>
<li>GC优化是到最后不得已才采用的手段</li>
<li>在实际使用中，分析GC情况，优化代码比优化GC参数要好使</li>
</ol>
<h2 id="JVM调优命令有哪些"><a href="#JVM调优命令有哪些" class="headerlink" title="JVM调优命令有哪些"></a>JVM调优命令有哪些</h2><p>Sun JDK监控和故障处理命令有jps、jstat、jmap、jhat、jstack、jinfo</p>
<ul>
<li>jps<br>JVM Process Status Tool，显示指定系统内所有的HotSpot虚拟机进程</li>
<li>jstat<br>JVM statistics Monitoring是用于监视虚拟机运行时状态信息的命令，它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据</li>
<li>jmap<br>JVM Memory Map命令用于生成heap dump文件</li>
<li>jhat<br>JVM Heap Analysis Tool命令是与jmap搭配使用，用来分析jmap生成的dump，jhat内置了一个微型的HTTP/HTML服务器，生成dump的分析结果后，可以在浏览器中查看</li>
<li>jstack<br>用于生成java虚拟机当前时刻的线程快照</li>
<li>jinfo<br>JVM Configuration info 这个命令作用是实时查看和调整虚拟机运行参数</li>
</ul>
<h2 id="调优工具"><a href="#调优工具" class="headerlink" title="调优工具"></a>调优工具</h2><p>常用调优工具分为两类，jdk自带监控工具：jconsole和jvisualvm。第三方有：MAT(Memory Analyzer Tool)、GChisto</p>
<ul>
<li>jconsole<br>Java Monitoring and Management Console是从java5开始，在JDK中自带的java监控和管理控制台，用于对JVM中内存，线程和类等的监控</li>
<li>jvisualvm<br>jdk自带全能工具，可以分析内存快照、线程快照。监控内存变化、GC变化等</li>
<li>MAT<br>Memory Analyzer Tool，一个基于Eclipse的内存分析工具，是一个快速、功能丰富的Java heap分析工具，它可以帮助我们查找内存泄漏和减少内存消耗</li>
<li>GChisto<br>一款专业分析gc日志的工具</li>
</ul>
<h2 id="JVM性能调优参数有哪些"><a href="#JVM性能调优参数有哪些" class="headerlink" title="JVM性能调优参数有哪些"></a>JVM性能调优参数有哪些</h2><ul>
<li>设定堆内存大小<br>-Xmx：堆内存最大限制</li>
<li>设定新生代大小（新生代不宜太小，太小会有大量的对象涌入老年代）<br>-XX:NewSize：新生代大小<br>-XX:NewRatio 新生代和老生代占比。默认值为2<br>-XX:SurvivorRatio：Eden空间和Survivor空间的占比。默认值为8，代表Eden：Survivor1：Survivor2=8:1:1</li>
<li>设定垃圾回收器<br>年轻代用 -XX:+UseParNewGC<br>年老代用-XX:+UseConcMarkSweepGC</li>
<li>大对象阈值定义<br>-XX:PretenureSizeThreshold参数设置，默认为0</li>
<li>新生代经过多杀次GC后进入老年代<br>-XX:MaxTenuringThreshold设置参数，默认值为15</li>
</ul>
<h2 id="JVM核心参数有哪些"><a href="#JVM核心参数有哪些" class="headerlink" title="JVM核心参数有哪些"></a>JVM核心参数有哪些</h2><p>参数表示方法：</p>
<ol>
<li>标准参数（-)<br>所有的JVM实现都必须实现这些参数的功能，而且向后兼容</li>
<li>非标准参数（-X）<br>默认JVM实现这些参数的功能，但是并不保证所有JVM实现都满足，且不保证向后兼容</li>
<li>非Stable参数（-XX）<br>此类参数各个JVM实现会有所不同，将来可能会随时取消，需要慎重使用（但是，这些参数往往是非常有用的）</li>
</ol>
<p>以JDK1.8为例。</p>
<pre><code class="bash">-Xms2g -Xmx2g  #（按不同容器，4G及以下建议为50%，6G以上，建议设置为70%）
-XX:MetaspaceSize=128m 
-XX:MaxMetaspaceSize=512m
-Xss256k
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:AutoBoxCacheMax=20000 
-XX:+HeapDumpOnOutOfMemoryError   #（当JVM发生OOM时，自动生成DUMP文件）
-XX:HeapDumpPath=/data/logs/gc/
-XX:ErrorFile=/data/logs/gc/hs_err_%p.log   #（当JVM发生崩溃时，自动生成错误日志）
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:/data/logs/gc/gc-ePrint-service.log
</code></pre>
<p>基本参数说明：</p>
<table>
<thead>
<tr>
<th>参数名称</th>
<th>含义</th>
<th>默认值</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td>-Xms</td>
<td>初始堆大小</td>
<td>内存的1/64</td>
<td>默认空余堆内存小于40%（MinHeapFreeRatio参数可以调整）时，JVM就会增大堆内存，直到-Xmx最大限制</td>
</tr>
<tr>
<td>-Xmx</td>
<td>最大堆大小</td>
<td>内存的  1/4</td>
<td>默认空余堆内存大于70%（MaxHeapFreeRatio参数可以调整）时，JVM会减少堆内存，直到-Xms的最小限制</td>
</tr>
<tr>
<td>-Xmn</td>
<td>年轻代大小</td>
<td></td>
<td>1. 此处的大小是Eden + 2 survivor space。和jmap -heap中显示的New gen是不一样的<br />2. 整个堆的大小 = 年轻代大小 + 老年代大小 + 持久代大小<br />3. 增加年轻代大小后，将会减少老年代大小，此值对系统性能影响较大，Sun官方推荐配置为整个堆的3/8|<br />4. -Xms与-Xmx相同时不需要配置该值</td>
</tr>
<tr>
<td>-XX:NewSize</td>
<td>设置年轻代大小</td>
<td></td>
<td></td>
</tr>
<tr>
<td>-XX:MaxNewSize</td>
<td>年轻代最大值</td>
<td></td>
<td></td>
</tr>
<tr>
<td>-XX:MetaspaceSize</td>
<td>元空间大小</td>
<td></td>
<td></td>
</tr>
<tr>
<td>-XX:MaxMetaspaceSize</td>
<td>最大元空间</td>
<td></td>
<td></td>
</tr>
<tr>
<td>-Xss</td>
<td>每个线程的堆栈大小</td>
<td>256k</td>
<td>1. JDK5以后每个线程堆栈大小为1M，以前每个线程堆栈大小为256k。根据应用的线程所需内存大小进行调整，在相同物理内存下，减小该值能生成更多的线程，但是操作系统对一个进程内的线程数还是有限制的，不能无限生成，经验值在3000~5000左右<br />2. 一般小的应用，如果栈不是很深，应该是128k左右够用。大的应用建议使用256k。这个参数对性能的影响较大，需要严格的测试</td>
</tr>
<tr>
<td>-XX:ThreadStackSize</td>
<td>线程堆大小</td>
<td></td>
<td></td>
</tr>
<tr>
<td>-XX:NewRatio</td>
<td>年轻代（包括Eden和两个Survivor区）和老年代的比值（去处持久代）</td>
<td></td>
<td>1. -XX:NewRatio=4表示年轻代与老年代所占比值为1:4，年轻代占整堆的1/5<br />2. Xms=Xmx并且设置了Xmn的情况下，该参数不需要进行设置</td>
</tr>
<tr>
<td>-XX:SurvivorRatio</td>
<td>Eden区和Survivor区的大小比值</td>
<td></td>
<td>设置为8，则两个Survivor区与Eden区的比值为2:8，一个Survivor区占整个年轻代的1/10</td>
</tr>
<tr>
<td>-XX:LargePageSizeInBytes</td>
<td>内存页大小</td>
<td>128M</td>
<td>设置过大会影响Perm的大小</td>
</tr>
<tr>
<td>-XX:+UseFastAccessorMethods</td>
<td>原始类型的快速优化</td>
<td></td>
<td></td>
</tr>
<tr>
<td>-XX:+DisableExplicitGC</td>
<td>关闭System.gc()方法</td>
<td></td>
<td>这个参数需要严格的测试</td>
</tr>
<tr>
<td>-XX:+ExplicitGCInvokesConcurrent</td>
<td>关闭System.gc()方法</td>
<td>disable</td>
<td>通过使用System.gc()启用系统并发GC。该项默认是禁用，只能与-XX:+UseConcMarkSweepGC选项一起启用</td>
</tr>
<tr>
<td>-XX:+ExplicitGCInvokesConcurrent<br />AndUnloadsClasses</td>
<td>关闭System.gc()方法</td>
<td>disable</td>
<td>通过使用System.gc()启用系统并发GC并且在并发GC循环期间卸载类。该项默认是禁用，只能与-XX:+UseConcMarkSweepGC选项一起启用</td>
</tr>
<tr>
<td>-XX:MaxTenuringThreshold</td>
<td>垃圾的最大年龄</td>
<td>15</td>
<td>1. 如果设置为0的话，则年轻代对象不经过Survivor区，直接进入老年代。对于老年代比较多的应用，可以提高效率。<br />2. 如果设置比较大的值，则年轻代对象会在Survivor区进行多次复制，这样可以增加对象在年轻代的存活时间，增加在年轻代就被收回的概率<br />3. 该参数只有在串行GC时才有效</td>
</tr>
<tr>
<td>-XX:+AggressiveOpts</td>
<td>加快编译</td>
<td></td>
<td></td>
</tr>
<tr>
<td>-XX:+UseBiasedLocking</td>
<td>锁机制的性能改善</td>
<td></td>
<td></td>
</tr>
<tr>
<td>-Xnoclassgc</td>
<td>禁用垃圾回收</td>
<td></td>
<td></td>
</tr>
<tr>
<td>-XX:SofeRefLRUPolicyMSPerMB</td>
<td>每兆堆空闲空间中SofeReference的存活时间</td>
<td>1s</td>
<td>软可达对象在最后一次引用他们之后的一段时间内仍然是活跃的。默认值是堆空间中每空闲兆字节的一秒生命周期</td>
</tr>
<tr>
<td>-XX:PretenureSizeThreshold</td>
<td>对象超过多大就分配在旧生代中</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>-XX:TLABWasteTargetPercent</td>
<td>TLAB占Eden区的百分比</td>
<td>1%</td>
<td></td>
</tr>
<tr>
<td>-XX:+CollectGen0First</td>
<td>Full GC时是否先YGC</td>
<td>False</td>
<td></td>
</tr>
</tbody></table>
<h2 id="元空间里面存放的是什么"><a href="#元空间里面存放的是什么" class="headerlink" title="元空间里面存放的是什么"></a>元空间里面存放的是什么</h2><p>JDK1.8中已经移除了永久代，新加了一个叫做元数据区的native。方法区是一种规范，规范没变，它就一直在。只不过取代永久代的是元空间（Metaspace）而已。</p>
<p><img src="https://gitee.com/xiaomaer-sss/picgo/raw/master/images/2023/image-20230130142650844.png" alt="image-20230130142650844"></p>

      
       <hr><span style="font-style: italic;color: gray;"> 转载请注明来源，欢迎对文章中的引用来源进行考证，欢迎指出任何有错误或不够清晰的表达。可以邮件至 jackma.h@foxmail.com </span>
    </div>
</article>


<p>
    <a  class="dashang" onclick="dashangToggle()">💰</a>
</p>






    




    </div>
    <div class="copyright">
        <p class="footer-entry">
    ©2017 kiwi
</p>
<p class="footer-entry">Built with <a href="https://hexo.io/" target="_blank">Hexo</a> and <a href="https://github.com/yelog/hexo-theme-3-hexo" target="_blank">3-hexo</a> theme</p>

    </div>
    <div class="full-toc">
        <button class="full" data-title="切换全屏 快捷键 s"><span class="min "></span></button>
<a class="" id="rocket" ></a>

    </div>
</div>

<div class="hide_box" onclick="dashangToggle()"></div>
<div class="shang_box">
    <a class="shang_close"  onclick="dashangToggle()">×</a>
    <div class="shang_tit">
        <p>Help us with donation</p>
    </div>
    <div class="shang_payimg">
        <div class="pay_img">
            <img src="/img/alipay.jpg" class="alipay" title="扫码支持">
            <img src="/img/weixin.jpg" class="weixin" title="扫码支持">
        </div>
    </div>
    <div class="shang_payselect">
        <span><label><input type="radio" name="pay" checked value="alipay">alipay</label></span><span><label><input type="radio" name="pay" value="weixin">weixin</label></span>
    </div>
</div>


</body>
<script src="/js/jquery.pjax.js?v=1.1.0" ></script>

<script src="/js/script.js?v=1.1.0" ></script>
<script>
    var img_resize = 'default';
    function initArticle() {
        /*渲染对应的表格样式*/
        
            $("#post .pjax table").addClass("green_title");
        

        /*渲染打赏样式*/
        
        $("input[name=pay]").on("click", function () {
            if($("input[name=pay]:checked").val()=="weixin"){
                $(".shang_box .shang_payimg .pay_img").addClass("weixin_img");
            } else {
                $(".shang_box .shang_payimg .pay_img").removeClass("weixin_img");
            }
        })
        

        /*高亮代码块行号*/
        

        /*访问数量*/
        
        $.getScript("//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js");
        

        /*代码高亮，行号对齐*/
        $('.pre-numbering').css('line-height',$('.has-numbering').css('line-height'));

        
        
    }

    /*打赏页面隐藏与展示*/
    
    function dashangToggle() {
        $(".shang_box").fadeToggle();
        $(".hide_box").fadeToggle();
    }
    

</script>

<!--加入行号的高亮代码块样式-->

<!--自定义样式设置-->
<style>
    
    
    .nav {
        width: 542px;
    }
    .nav.fullscreen {
        margin-left: -542px;
    }
    .nav-left {
        width: 120px;
    }
    
    
    @media screen and (max-width: 1468px) {
        .nav {
            width: 492px;
        }
        .nav.fullscreen {
            margin-left: -492px;
        }
        .nav-left {
            width: 100px;
        }
    }
    
    
    @media screen and (max-width: 1024px) {
        .nav {
            width: 492px;
            margin-left: -492px
        }
        .nav.fullscreen {
            margin-left: 0;
        }
    }
    
    @media screen and (max-width: 426px) {
        .nav {
            width: 100%;
        }
        .nav-left {
            width: 100%;
        }
    }
    
    
    .nav-right .title-list nav a .post-title, .nav-right .title-list #local-search-result a .post-title {
        color: #383636;
    }
    
    
    .nav-right .title-list nav a .post-date, .nav-right .title-list #local-search-result a .post-date {
        color: #5e5e5f;
    }
    
    
    .nav-right nav a.hover, #local-search-result a.hover{
        background-color: #e2e0e0;
    }
    
    

    /*列表样式*/
    
    #post .pjax article .article-entry>ol, #post .pjax article .article-entry>ul, #post .pjax article>ol, #post .pjax article>ul{
        border: #e2dede solid 1px;
        border-radius: 10px;
        padding: 10px 32px 10px 56px;
    }
    #post .pjax article .article-entry li>ol, #post .pjax article .article-entry li>ul,#post .pjax article li>ol, #post .pjax article li>ul{
        padding-top: 5px;
        padding-bottom: 5px;
    }
    #post .pjax article .article-entry>ol>li, #post .pjax article .article-entry>ul>li,#post .pjax article>ol>li, #post .pjax article>ul>li{
        margin-bottom: auto;
        margin-left: auto;
    }
    #post .pjax article .article-entry li>ol>li, #post .pjax article .article-entry li>ul>li,#post .pjax article li>ol>li, #post .pjax article li>ul>li{
        margin-bottom: auto;
        margin-left: auto;
    }
    

    /* 背景图样式 */
    
    #post {
        background: url([object Object]);
    }
    
    
    #post .index {
        background: url([object Object]);
    }
    


    /*引用块样式*/
    

    /*文章列表背景图*/
    
    .nav-right:before {
        content: ' ';
        display: block;
        position: absolute;
        left: 0;
        top: 0;
        width: 100%;
        height: 100%;
        opacity: 0.3;
        background: url("https://i.loli.net/2019/07/22/5d3521411f3f169375.png");
        background-repeat: no-repeat;
        background-position: 50% 0;
        -ms-background-size: cover;
        -o-background-size: cover;
        -moz-background-size: cover;
        -webkit-background-size: cover;
        background-size: cover;
    }
    

    
</style>







</html>
